#pragma once

#include "position.hpp"

/**
 * @brief 描述各类事件的类型
 */
enum NatureEventsType
{
    NET_EAT,
    NET_DIE,
    NET_STROLL
};

class Creature;

/**
 * @brief 自然界发生的事件，某个主体（subject）对某个物体（object）做了什么
 */
class Event
{
protected:
    /**
     * @brief 事件类型
     */
    NatureEventsType m_type;

    int m_round = 0; // 时间

    Position m_old_pos; // 地点（起始）
    Position m_new_pos; // 地点（结束）

    int m_id = -1; // 发起者ID

    int m_target_id = -1; // 目标ID

public:
    Event(NatureEventsType t, int r) : m_type(t), m_round(r)
    {
    }

    void set_id(int id)
    {
        m_id = id;
    }

    void set_target_id(int id)
    {
        m_target_id = id;
    }

    void set_old_pos(const Position &p)
    {
        m_old_pos = p;
    }

    void set_new_pos(const Position &p)
    {
        m_new_pos = p;
    }

    void print()
    {
        std::cout << m_round << ": "
                  << " (" << m_old_pos.x << ", " << m_old_pos.y << ") "
                  << " -> (" << m_new_pos.x << ", " << m_new_pos.y << ") "
                  << m_id << " " << m_type << " " << m_target_id << std::endl;
    }
};
